home *** CD-ROM | disk | FTP | other *** search
/ PC World Interactive 7 / PC World Interactive 7.iso / program / cprog.EXE / VESA2.C < prev    next >
C/C++ Source or Header  |  1995-09-20  |  5KB  |  136 lines

  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <dos.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7.  union REGS regs;
  8.  struct SREGS segregs;
  9.  
  10.  struct vesa
  11.  {
  12.   char vesa[4];          // VESA yazisi
  13.   unsigned char secver;  // Ikincil versiyon
  14.   unsigned char mainver; // Ana versiyon
  15.   char far *manifacturer;// Uretici firma
  16.   unsigned long flag;    // Kullanilmiyor
  17.   unsigned far *modes;   // Kartin destekledigi modlar
  18.  } infobuf,*iptr=&infobuf;
  19.  
  20.  struct vesamod
  21.  {
  22.   unsigned modeflag;        // VESA modu bilgileri
  23.   unsigned char firstflag;  // ilk pencere bilgileri
  24.   unsigned char secflag;    // ikinci pencere bilgileri
  25.   unsigned granularity;     // VESA penceresi hareket orani
  26.   unsigned size;            // VESA penceresi boyu
  27.   unsigned firstseg;        // ilk pencerenin segment adresi
  28.   unsigned secseg;          // ikinci pencerenin segment adresi
  29.   void far *routine;        // video RAM'daki pencere yerini belirten rutinin adresi
  30.   unsigned pixelperline;    // bir satirdaki pixel sayisinin toplam tuttugu byte sayisi
  31.   unsigned x;               // X cozunurlugu
  32.   unsigned y;               // Y cozunurlugu
  33.   unsigned char width;      // text modlari icin karakterlerin X cozunurlugu
  34.   unsigned char height;     // text modlari icin karakterlerin Y cozunurlugu
  35.   unsigned char bitplanes;  // bitplane sayisi
  36.   unsigned char bits;       // pixel basina dusen bit sayisi
  37.   unsigned char memblock;   // hafiza blogu sayisi
  38.   unsigned char memmodel;   // hafiza tipi
  39.   unsigned char memsize;    // hafiza blogu boyutu(KB)
  40.  } modbuf,*mptr=&modbuf;
  41.  
  42. void main(void)
  43. {
  44.  
  45.  int a,dum;
  46.  int modeok=0;
  47.  unsigned gran;
  48.  unsigned char ff,sf;
  49.  unsigned char far *ekran;
  50.  unsigned char yaz=0,oku=0;
  51.  char dummy[150];
  52.  
  53.  regs.h.ah = 0x4F;  /* VESA fonksiyonu */
  54.  regs.h.al = 0x00;  /* 0 no'lu altfonksiyon: SVGA kartinin ozellikleri? */
  55.  segregs.es = FP_SEG(iptr);
  56.  regs.x.di = FP_OFF(iptr);
  57.  int86x(0x10, ®s, ®s, &segregs);
  58.  if (regs.h.ah!=0) {printf("\n Bu grafik karti VESA fonksiyonlarini desteklemez.\n");exit(1);}
  59.  
  60.  strncpy(dummy,infobuf.vesa,4);
  61.  dummy[4]='\0';
  62.  
  63.  printf("\n%s: v%d.%d",dummy,infobuf.mainver,infobuf.secver);
  64.  _fstrcpy(dummy,infobuf.manifacturer);
  65.  printf("\nFirma: %s \nDesteklenen modlar:",dummy);
  66.  
  67.  while (*infobuf.modes!=0xFFFF)
  68.     {printf("\n                Mod: %Xh",*infobuf.modes);
  69.      regs.h.ah = 0x4F;  /* VESA fonksiyonu */
  70.      regs.h.al = 0x01;  /* 1 no'lu altfonksiyon: VESA modunun ozellikleri? */
  71.      regs.x.cx = *infobuf.modes;
  72.      segregs.es = FP_SEG(mptr);
  73.      regs.x.di = FP_OFF(mptr);
  74.      int86x(0x10, ®s, ®s, &segregs);
  75.      for(a=0,dum=1;a<modbuf.bits;a++,dum*=2); // bit sayisindan renk sayisi hesaplaniyor
  76.      if ((modbuf.modeflag&16)==16) // Mode flag 4. bit modun Grafik/Text oldugunu belirtir
  77.         strcpy(dummy,"Grafik modu"); else strcpy(dummy,"Text modu");
  78.      printf(" (%dx%d) %d renk %s.",modbuf.x,modbuf.y,dum,dummy);
  79.      if ((unsigned)*infobuf.modes==0x0101)
  80.         { modeok=1;
  81.           gran=modbuf.granularity;
  82.           ff=modbuf.firstflag;
  83.           sf=modbuf.secflag;
  84.         }
  85.      infobuf.modes++;
  86.     }
  87.  if (modeok)
  88.      printf("\n Simdi de 101h no'lu fonksiyonu deneyelim.Bir tusa basin:\n");
  89.  else {
  90.     printf("\n Bu kart 101h'i desteklemiyor.Ama siz mod numarasini degistirip \n programi tekrar compile ederek deniyebilirsiniz.\n");
  91.     exit(1);
  92.       }
  93.  getch();
  94.  regs.h.ah = 0x4F;  /* VESA fonksiyonu */
  95.  regs.h.al = 0x02;  /* 2 no'lu altfonksiyon: VESA modunda ekran acma */
  96.  regs.x.bx = 0x0101;  /* 640x480x256 VESA modu */
  97.  int86x(0x10, ®s, ®s, &segregs);
  98.  if (!((regs.h.ah==0)&&(regs.h.al==0x4f)))
  99.     { textmode(3);
  100.       printf("Mod acilmadi");
  101.       exit(2);
  102.     }
  103.  // Ekran erisim pencerelerinin durumlarina bakalim
  104.  if ((ff&1)==1) // 1. pencere var mi?
  105.     if ((ff&2)==2) // okunuyor mu ?
  106.        oku=0;
  107.     else if ((ff&4)==4) yaz=0;// yaziliyor mu
  108.  if ((sf&1)==1) // 2. pencere var mi?
  109.     if ((sf&2)==2) // okunuyor mu ?
  110.        oku=1;
  111.     else if ((sf&4)==4) yaz=1;// yaziliyor mu
  112.  
  113.  // Ekrana bisey cizelim, ilk 100 satira enine renkli cizgiler
  114.  ekran=MK_FP(0xA000,0);
  115.  for (dum=0;dum<100;dum++)
  116.     for(a=0;a<640;a++) {*ekran=(unsigned char)dum;ekran++;}
  117.  
  118. // devam etmek icin sayfa degistiriyoruz
  119.  regs.h.ah = 0x4F;  /* VESA fonksiyonu */
  120.  regs.h.al = 0x05;  /* 5 no'lu altfonksiyon: erisim penceresi degistirme */
  121.  regs.h.bh = 0x00;
  122.  regs.h.bl = yaz;   // ekrana yazim islemi yapiyoruz
  123.  regs.x.dx = (unsigned)(64000U/(gran*1024)); // 640x100 satir ileri (oran'a gore)
  124.  ekran=MK_FP(0xA000,(unsigned)(64000U%(gran*1024))); // fazlaliklari ayarlama
  125.  int86x(0x10, ®s, ®s, &segregs);
  126.  // Isterseniz aradan bu sayfa degistirmeyi kaldirin bakalim altlara pixel
  127.  // koyabiliyormusunuz, koyamiyormusunuz.
  128.  
  129.  // ikinci 90 satira da renkli cizgiler
  130.  for (;dum<190;dum++)
  131.     for(a=0;a<640;a++) {*ekran=(unsigned char)dum;ekran++;}
  132. // bitti
  133.  getch();
  134.  textmode(3);
  135.  exit(0);
  136. }